if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS})
  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS})
endif()

add_entrypoint_object(
  access
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.access
)

add_entrypoint_object(
  chdir
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.chdir
)

add_entrypoint_object(
  close
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.close
)

add_entrypoint_object(
  dup
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.dup
)

add_entrypoint_object(
  dup2
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.dup2
)

add_entrypoint_object(
  dup3
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.dup3
)

add_entrypoint_object(
  fchdir
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.fchdir
)

add_entrypoint_object(
  fork
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.fork
)

add_entrypoint_object(
  execv
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.execv
)

add_entrypoint_object(
  execve
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.execve
)

add_entrypoint_object(
  fsync
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.fsync
)

add_entrypoint_object(
  ftruncate
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.ftruncate
)

add_entrypoint_object(
  getcwd
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.getcwd
)

add_entrypoint_object(
  getpid
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.getpid
)

add_entrypoint_object(
  getppid
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.getppid
)

add_entrypoint_object(
  geteuid
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.geteuid
)

add_entrypoint_object(
  getuid
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.getuid
)

add_entrypoint_object(
  isatty
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.isatty
)

add_entrypoint_object(
  link
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.link
)

add_entrypoint_object(
  linkat
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.linkat
)

add_entrypoint_object(
  lseek
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.lseek
)

add_entrypoint_object(
  pread
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.pread
)

add_entrypoint_object(
  pwrite
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.pwrite
)

add_entrypoint_object(
  read
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.read
)

add_entrypoint_object(
  readlink
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.readlink
)

add_entrypoint_object(
  readlinkat
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.readlinkat
)

add_entrypoint_object(
  rmdir
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.rmdir
)

add_entrypoint_object(
  symlink
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.symlink
)

add_entrypoint_object(
  symlinkat
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.symlinkat
)

add_entrypoint_object(
  __llvm_libc_syscall
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.__llvm_libc_syscall
)

add_entrypoint_object(
  sysconf
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.sysconf
)

add_entrypoint_object(
  truncate
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.truncate
)

add_entrypoint_object(
  unlink
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.unlink
)

add_entrypoint_object(
  unlinkat
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.unlinkat
)

add_entrypoint_object(
  write
  ALIAS
  DEPENDS
    .${LIBC_TARGET_OS}.write
)

add_entrypoint_object(
  environ
  SRCS
    environ.cpp
  HDRS
    environ.h
)

add_entrypoint_object(
  getopt
  SRCS
    getopt.cpp
  HDRS
    getopt.h
  DEPENDS
    libc.include.unistd
    libc.src.__support.CPP.optional
    libc.src.__support.CPP.string_view
    libc.src.__support.File.file
    libc.src.stdio.fprintf
)

# These aren't actual external per-se, but this is just an easy way to create
# targets that don't do anything. They exist to be referenced in entrypoints.txt
# so that the header will properly expose their definitions. Their declaration
# is in getopt.cpp.
add_entrypoint_external(
  optarg
)

add_entrypoint_external(
  optind
)

add_entrypoint_external(
  optopt
)

add_entrypoint_external(
  opterr
)
